<?php

namespace app;

use app\admin\service\common\DataScopeService;
use app\common\facade\Principal;
use think\db\Query;
use think\facade\Log;
use think\Model;
use think\model\concern\SoftDelete;

class BaseModel extends Model
{
    // 软删除
    use SoftDelete;

    // 自动写入时间戳
    protected string $autoWriteTimestamp = 'datetime';

    // 全局隐藏字段
    protected $hidden = ['password'];

    /**
     * 添加数据权限作用域
     * @param bool $enable
     * @return Query|static
     */
    public static function withPerms(bool $enable = true): Query | static
    {
        if ($enable) {
            return self::scope('DataScope');
        } else {
            return self::scope('DataAllow');
        }
    }

    /**
     * 数据权限作用域（内部使用）
     * @param Query $query
     * @return void
     */
    public function scopeDataScope(Query $query): void
    {
        trace('查询有数据权限要求');

        // 获取当前模型实例关联的表名
        $tableName = $this->getTable();

        // 获取查询对象上可能存在的别名设置
        $alias = $query->getOptions('alias');

        // 优先使用别名，如果不存在，则使用原始表名
        $tableIdentifier = isset($alias[$tableName]) ? $alias[$tableName] : $tableName;

        // 获取用户信息
        $userInfo = Principal::getUserInfo();

        // 获取数据权限服务实例
        $dataScopeService = app(DataScopeService::class);

        // 调用服务，将权限条件应用到查询对象上
        $dataScopeService->apply($query, $userInfo ?? [], $tableIdentifier);
    }

    public function scopeDataAllow(Query $query): void
    {
        trace('查询无数据权限要求');
        // 空作用域，不做任何过滤操作
    }


    /**
     * 自动化处理：创建者，创建者部门，状态，排序
     * 提示：如此处配置无效，请检查子类是否同样配置了 onBeforeInsert
     * @param Model $model
     * @return void
     */
    public static function onBeforeInsert(Model $model,): void
    {
        // 自动填充创建者
        if (!isset($model['create_id']) || empty($model['create_id'])) {
            $model['create_id'] = Principal::hasLogin() ? Principal::getUserId() : 0;
        }
        // 自动填充创建者部门
        if (!isset($model['create_dept']) || empty($model['create_dept'])) {
            $model['create_dept'] = Principal::hasLogin() ? Principal::getDeptId() : 0;
        }
        // 自动填充状态
        if (!isset($model['status']) || empty($model['status'])) {
            $model['status'] = 1;
        }
    }


    /**
     * 添加后修改排序号
     * 提示：如此处配置无效，请检查子类是否同样配置了 onAfterInsert
     * @param Model $model
     * @return void
     */
    public static function onAfterInsert(Model $model): void
    {
        $pkValue = $model->getKey();
        if (!isset($model['sort'])) {
            $model::where($model->getPk(), $pkValue)->update(['sort' => $pkValue]);
        }
    }


    /**
     * 自动化：删除者，更新者
     * 提示：如此处配置无效，请检查子类是否同样配置了 onBeforeUpdate
     * @param Model $model
     * @return void
     */
    public static function onBeforeUpdate(Model $model): void
    {
        $isSoftDelete = !empty($model['delete_time']);
        if ($isSoftDelete) {
            if (empty($model['delete_id'])) {
                $model['delete_id'] = Principal::hasLogin() ? Principal::getUserId() : 0;
            }
            unset($model['update_id']);
        } else {
            $model['update_id'] = Principal::hasLogin() ?  Principal::getUserId() : 0;
            // 这里必须检查是否存在排序号属性，如果存在则不能删除
            if (isset($model['sort']) && empty($model['sort'])) {
                unset($model['sort']);
            }
        }
    }
}